 /******************************************************************************
  * @file    PT32X005_gpio.h
  * @author  应用开发团队
  * @version V1.1.0
  * @date    2020/1/27
  * @brief    This file contains all the functions prototypes for the GPIO firmware library.
  *
  ******************************************************************************
  * @attention
  *
  *
  *****************************************************************************/

/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef PT32X005_GPIO_H
#define PT32X005_GPIO_H

#ifdef __cplusplus
extern "C" {
#endif

/* Includes ------------------------------------------------------------------*/
#include "PT32X005.h"


/** @addtogroup GPIO
  * @{
  */

/* Exported types ------------------------------------------------------------*/

#define IS_GPIO_ALL_PERIPH(PERIPH)	(((PERIPH) == GPIOA) || \
									((PERIPH) == GPIOB) || \
									((PERIPH) == GPIOC) || \
									((PERIPH) == GPIOD))

#define IS_AFIO_ALL_PERIPH(PERIPH)	(((PERIPH) == AFIOA) || \
									((PERIPH) == AFIOB) || \
									((PERIPH) == AFIOC) || \
									((PERIPH) == AFIOD))


/** @defgroup Configuration_Mode_enumeration **/
typedef enum
{
	GPIO_Mode_IN   = 0x00, 	/*!< GPIO Input Mode              */
	GPIO_OType_PP,         	/*!< GPIO Output Mode             */
	GPIO_OType_OD,
} GPIOMode_TypeDef;


#define IS_GPIO_MODE(MODE)	(((MODE) == GPIO_Mode_IN)|| \
							((MODE) == GPIO_OType_PP) || \
							((MODE) == GPIO_OType_OD))


/** @defgroup Configuration_Pull-Up_Pull-Down_enumeration **/
typedef enum
{
	GPIO_PuPd_NOPULL = 0x00,
	GPIO_PuPd_UP     = 0x01,
	GPIO_PuPd_DOWN   = 0x02
} GPIOPuPd_TypeDef;


#define IS_GPIO_PUPD(PUPD) 		(((PUPD) == GPIO_PuPd_NOPULL) || \
								((PUPD) == GPIO_PuPd_UP) || \
								((PUPD) == GPIO_PuPd_DOWN))


/** @defgroup Bit_SET_and_Bit_RESET_enumeration **/
typedef enum
{
	Bit_RESET = 0,
	Bit_SET
} BitAction;
#define IS_GPIO_BIT_ACTION(ACTION) (((ACTION) == Bit_RESET) || ((ACTION) == Bit_SET))



/** @brief  GPIO Init structure definition **/
typedef struct
{
	u32 GPIO_Pin;              /*!< Specifies the GPIO pins to be configured.
                                       This parameter can be any value of @ref GPIO_pins_define */
	GPIOMode_TypeDef GPIO_Mode;     /*!< Specifies the operating mode for the selected pins.
                                       This parameter can be a value of @ref GPIOMode_TypeDef   */
	GPIOPuPd_TypeDef GPIO_PuPd;     /*!< Specifies the operating Pull-up/Pull down for the selected pins.
                                       This parameter can be a value of @ref GPIOPuPd_TypeDef   */
} GPIO_InitTypeDef;


/* Exported constants --------------------------------------------------------*/

/** @defgroup IS_GPIO_PIN_SEL&GET **/
#define IS_GPIO_PIN_SEL(SEL) ((((SEL) & (u32)0xffff0000) == 0) && ((SEL) != (u32)0x0000))
#define IS_GPIO_PIN_GET(SEL)	(((SEL) == GPIO_Pin_0) || \
								((SEL) == GPIO_Pin_1) || \
								((SEL) == GPIO_Pin_2) || \
								((SEL) == GPIO_Pin_3) || \
								((SEL) == GPIO_Pin_4) || \
								((SEL) == GPIO_Pin_5) || \
								((SEL) == GPIO_Pin_6) || \
								((SEL) == GPIO_Pin_7) || \
								((SEL) == GPIO_Pin_8) || \
								((SEL) == GPIO_Pin_9) || \
								((SEL) == GPIO_Pin_10) || \
								((SEL) == GPIO_Pin_11) || \
								((SEL) == GPIO_Pin_12) || \
								((SEL) == GPIO_Pin_13) || \
								((SEL) == GPIO_Pin_14) || \
								((SEL) == GPIO_Pin_15))


/** @defgroup GPIO_Pin_sources **/
#define IS_AFIO_PIN_SEL(SEL) ((((SEL) & (u32)0xffff0000) == 0) && ((SEL) != (u32)0x0000))
#define IS_AFIO_PIN_SET(SEL)	(((SEL) == AFIO_Pin_0) || \
								((SEL) == AFIO_Pin_1) || \
								((SEL) == AFIO_Pin_2) || \
								((SEL) == AFIO_Pin_3) || \
								((SEL) == AFIO_Pin_4) || \
								((SEL) == AFIO_Pin_5) || \
								((SEL) == AFIO_Pin_6) || \
								((SEL) == AFIO_Pin_7) || \
								((SEL) == AFIO_Pin_8) || \
								((SEL) == AFIO_Pin_9) || \
								((SEL) == AFIO_Pin_10) || \
								((SEL) == AFIO_Pin_11) || \
								((SEL) == AFIO_Pin_12) || \
								((SEL) == AFIO_Pin_13) || \
								((SEL) == AFIO_Pin_14) || \
								((SEL) == AFIO_Pin_15))


/** @brief  AF Primary selection **/
#define IS_AFIO_AF_SEL(SEL)	(((SEL) == AFIO_AF_None) || \
							((SEL) == AFIO_AF_0) || \
							((SEL) == AFIO_AF_1) ||  \
							((SEL) == AFIO_AF_2) || \
							((SEL) == AFIO_AF_3) || \
							((SEL) == AFIO_AF_4) || \
							((SEL) == AFIO_AF_5) || \
							((SEL) == AFIO_AF_6))


/* Exported macro ------------------------------------------------------------*/
/* Exported functions ------------------------------------------------------- */
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct);
u8 GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, u16 GPIO_Pin);
u16 GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
u8 GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, u16 GPIO_Pin);
u16 GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
void GPIO_SetBits(GPIO_TypeDef* GPIOx, u32 GPIO_Pin);
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, u32 GPIO_Pin);
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, u32 GPIO_Pin, BitAction BitVal);
void GPIO_Write(GPIO_TypeDef* GPIOx, u16 PortVal);
void GPIO_ReverseBits(GPIO_TypeDef* GPIOx, u32 GPIO_Pin);

void GPIO_AnaRemapConfig(AFIO_TypeDef* AFIOx, u32 AFIO_Pin, FunctionalState NewState);
void GPIO_DigRemapConfig(AFIO_TypeDef* AFIOx, u16 AFIO_Pin, u8 AFIO_AF, FunctionalState NewState);
void GPIO_ClearPinAF(AFIO_TypeDef* AFIOx, u16 GPIO_Pin);

void GPIO_SetLowByte(GPIO_TypeDef* GPIOx, u16 GPIO_Pin);
void GPIO_ResetLowByte(GPIO_TypeDef* GPIOx, u16 GPIO_Pin);
void GPIO_SetHighByte(GPIO_TypeDef* GPIOx, u16 GPIO_Pin);
void GPIO_ResetHighByte(GPIO_TypeDef* GPIOx, u16 GPIO_Pin);
void GPIO_HigByte_WriteBit(GPIO_TypeDef* GPIOx, u16 GPIO_Pin,u8 bitDat);
/**
  * @}
  */


#ifdef __cplusplus
}
#endif

#endif


